package create.singleton;

/**
 * @author dali
 * @date 2021-07-06 13:28
 * @Description 双重检查
 */

public class DoubleCheck {
    public static void main(String[] args) {
        DoubleCheck instance1 = getInstance();
        DoubleCheck instance2 = getInstance();
        System.out.println(instance1 == instance2);//true
    }
    //如果有变化立马刷新，不会重排序
    private static volatile DoubleCheck instance;

    private DoubleCheck() {}

    //两个判断，一个同步方法
    public static DoubleCheck getInstance() {
        //如果此时已经有实例，那么直接返回实例，保证效率
        if (instance == null) {
            synchronized (DoubleCheck.class) {
                //假设两个线程AB，A此时走到了这行，B在synchronized的上行，但已经判断为空了，A在走完创建实例方法之后
                //如果没有判断，那么B会再次创建一次实例，那么就会存在多线程多个实例的情况
                if (instance == null) {
                    instance = new DoubleCheck();
                }
            }
        }
        return instance;
    }

}
